  //设计一个算法，判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘，由字符" "，"X"和"O"组成，其中字符" "代表一个空位。 
//
// 以下是井字游戏的规则： 
//
// 
// 玩家轮流将字符放入空位（" "）中。 
// 第一个玩家总是放字符"O"，且第二个玩家总是放字符"X"。 
// "X"和"O"只允许放置在空位中，不允许对已放有字符的位置进行填充。 
// 当有N个相同（且非空）的字符填充任何行、列或对角线时，游戏结束，对应该字符的玩家获胜。 
// 当所有位置非空时，也算为游戏结束。 
// 如果游戏结束，玩家不允许再放置字符。 
// 
//
// 如果游戏存在获胜者，就返回该游戏的获胜者使用的字符（"X"或"O"）；如果游戏以平局结束，则返回 "Draw"；如果仍会有行动（游戏未结束），则返回 "P
//ending"。 
//
// 示例 1： 
//
// 输入： board = ["O X"," XO","X O"]
//输出： "X"
// 
//
// 示例 2： 
//
// 输入： board = ["OOX","XXO","OXO"]
//输出： "Draw"
//解释： 没有玩家获胜且不存在空位
// 
//
// 示例 3： 
//
// 输入： board = ["OOX","XXO","OX "]
//输出： "Pending"
//解释： 没有玩家获胜且仍存在空位
// 
//
// 提示： 
//
// 
// 1 <= board.length == board[i].length <= 100 
// 输入一定遵循井字棋规则 
// 
// Related Topics 数组

  
  package com.leetcode.editor.cn;
  /**
   * @author
   */
  public class TicTacToeLcci{
      public static void main(String[] args) {
           Solution solution = new TicTacToeLcci().new Solution();
      }
      //leetcode submit region begin(Prohibit modification and deletion)

      /**
       *
       */
      class Solution {
    public String tictactoe(String[] board) {
        return methodOne(board);
    }

  /**
   * 方法二
   * 执行耗时:25 ms,击败了5.03% 的Java用户
   * 内存消耗:40 MB,击败了5.09% 的Java用户
   */
    public String methodTwo(String[] board){
        int size = board.length;
        if (size < 2){
            return board[0];
        }
        String copyLine ,
                result = "Draw" ,
                firstStr = board[0].substring(0,1) ,
                endStr = board[0].substring(size-1,size);
        int downNext , upNext;
        boolean downDiagonal = firstStr.equals(" ")? false:true ,
                upDiagonal = endStr.equals(" ")?false:true;
        for (int i = 0 ; i < size ; i++){
            copyLine = board[i].replaceAll(" ","");
            if (copyLine.length() != size){
                result = "Pending";
            }
            copyLine = board[i].replaceAll("O","");
            copyLine = copyLine.replaceAll(" ","");
            if (copyLine.length() == size){
                return "X";
            }
            copyLine = board[i].replaceAll("X","");
            copyLine = copyLine.replaceAll(" ","");
            if (copyLine.length() == size){
                return "O";
            }

            copyLine = board[i];
            if (downDiagonal){
                downNext = copyLine.indexOf(firstStr,i);
                if (downNext != i){
                    downDiagonal = false;
                }
                if ( i == size - 1 && downDiagonal){
                    return firstStr;
                }
            }

            if (upDiagonal){
                upNext = copyLine.lastIndexOf(endStr,size-1-i);
                if (upNext != size-1-i){
                    upDiagonal = false;
                }
                if ( i == size - 1 && upDiagonal){
                    return endStr;
                }
            }
        }

        String compareStr;
        for (int j = 0 ; j < size ; j++){
//            copyLine = board[j];
            compareStr = board[0].substring(j,j+1);
            if (compareStr.equals(" ")){
                continue;
            }
            for (int k = 1 ; k <size ; k++){
                if (!compareStr.equals(board[k].substring(j,j+1))){
                    break;
                }
                if (k == size-1){
                    return compareStr;
                }
            }
        }
        return result;
    }

  /**
   * 方法一
   * 执行耗时:3 ms,击败了81.70% 的Java用户
   * 内存消耗:37.9 MB,击败了32.94% 的Java用户
   * @param board
   * @return
   */
    public String methodOne(String[] board){
        String result = "Draw";
        int len = board.length;
        if (len < 2){
            return board[0];
        }
        byte[][] chars = new byte[len][len];
        byte[] lineData;
        for (int i = 0 ; i < len ; i++){
            lineData = board[i].getBytes();
            for (int j = 0 ; j < len ; j++){
                chars[j][i] = lineData[j];
            }
            //查找每一行是否连成一线
            byte lineresult = checkLine(lineData);
            switch (lineresult){
                case '_':
                    break;
                case '-':
                    result = "Pending";
                    break;
                default:
                    char ss = (char) Integer.parseInt(String.valueOf(lineresult));
                    result = String.valueOf(ss);
                    return result;
            }
        }
        boolean column = true ,downDiagonal = true , upDiagonal = true;
        for (int i = 0 ; i < len ; i++){
            for (int j = 0 ; j < len - 1 ; j++){
                if (chars[i][j] == ' ' || chars[i][j+1] == ' '){
                    column = false;
                }
                //查找每一列是否连成一线
                if (column){
                    column = (chars[i][j] == chars[i][j+1]);
                    if (j == len-2 && column){
                        char ss = (char) Integer.parseInt(String.valueOf(chars[i][j]));
                        result = String.valueOf(ss);
                        return result;
                    }
                }
                //检查down
                if (i==j && i <= len-2){
                    if (downDiagonal){
                        downDiagonal = chars[i][j] == chars[i+1][j+1];
                        if (chars[i][j] == ' '){
                            downDiagonal = false;
                        }
                        if (j == len-2 && downDiagonal){
                            char ss = (char) Integer.parseInt(String.valueOf(chars[i][j]));
                            result = String.valueOf(ss);
                            return result;
                        }
                    }
                }
                //检查up
                if (i+j == len-2){
                    if (upDiagonal){
                        upDiagonal = chars[i][j+1] == chars[i+1][j];
                        if (chars[i][j+1] == ' '){
                            upDiagonal = false;
                        }
                        if (j == 0 && upDiagonal){
                            char ss = (char) Integer.parseInt(String.valueOf(chars[i][j+1]));
                            result = String.valueOf(ss);
                            return result;
                        }
                    }
                }
                if (!column && !downDiagonal && !upDiagonal){
                    continue;
                }
            }
            column = true;
        }
        return result;
    }
    private byte checkLine(byte[] chars){
        byte resultChar = 0;
        boolean result = true;
        for (int i = 0 ,size = chars.length - 1 ; i < size ; i++){
            //有空格
            if (chars[i] == ' ' || chars[i+1] == ' '){
                resultChar = '-';
            }
            if (result && chars[i] != ' '){
                result = (chars[i] == chars[i+1]);
            }
        }
        //有不相等
        if (!result && resultChar != '-'){
            resultChar = '_';
        }else if (result && chars[0] != ' '){
            resultChar = chars[0];
        }
        //全等
        return resultChar;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

  }